package com.ecommerce.service; // 包名

import com.ecommerce.entity.Order; // 导入订单实体
import com.ecommerce.repository.OrderRepository; // 导入订单仓库
import org.springframework.beans.factory.annotation.Autowired; // 自动注入注解
import org.springframework.stereotype.Service; // 服务注解
import org.springframework.transaction.annotation.Transactional; // 事务注解

import java.math.BigDecimal; // 大数字类型
import java.time.LocalDateTime; // 本地日期时间
import java.util.HashMap; // HashMap类型
import java.util.Map; // Map类型
import java.util.Optional; // Optional类型
import java.util.UUID; // UUID类型

@Service // 声明为Spring服务
public class PaymentService { // 支付服务类

    @Autowired // 自动注入OrderRepository
    private OrderRepository orderRepository; // 订单仓库

    // 处理支付请求
    @Transactional // 事务注解，确保数据一致性
    public Map<String, Object> processPayment(Long userId, Long orderId, String paymentMethod) {
        Map<String, Object> response = new HashMap<>(); // 创建响应对象
        
        try {
            // 查找订单
            Optional<Order> orderOptional = orderRepository.findById(orderId); // 根据ID查找订单
            if (!orderOptional.isPresent()) { // 如果订单不存在
                response.put("success", false); // 设置成功状态为false
                response.put("message", "订单不存在"); // 设置错误消息
                return response; // 返回响应
            }
            
            Order order = orderOptional.get(); // 获取订单对象
            
            // 验证订单是否属于当前用户
            if (!order.getUserId().equals(userId)) { // 检查用户ID是否匹配
                response.put("success", false); // 设置成功状态为false
                response.put("message", "订单不属于当前用户"); // 设置错误消息
                return response; // 返回响应
            }
            
            // 检查订单状态
            if (order.getStatus() != Order.OrderStatus.PENDING) { // 检查订单状态是否为待付款
                response.put("success", false); // 设置成功状态为false
                response.put("message", "订单状态不正确，无法支付"); // 设置错误消息
                return response; // 返回响应
            }
            
            // 生成支付二维码和支付信息
            Map<String, Object> paymentInfo = generatePaymentQRCode(order.getTotalAmount(), paymentMethod, order.getOrderNumber()); // 生成支付二维码
            
            response.put("success", true); // 设置成功状态为true
            response.put("message", "支付二维码生成成功"); // 设置成功消息
            response.put("paymentInfo", paymentInfo); // 返回支付信息
            response.put("orderId", orderId); // 返回订单ID
            response.put("paymentMethod", paymentMethod); // 返回支付方式
            response.put("amount", order.getTotalAmount()); // 返回支付金额
            
        } catch (Exception e) { // 捕获异常
            response.put("success", false); // 设置成功状态为false
            response.put("message", "支付处理失败: " + e.getMessage()); // 设置错误消息
        }
        
        return response; // 返回响应
    }
    
    // 生成支付二维码
    private Map<String, Object> generatePaymentQRCode(BigDecimal amount, String paymentMethod, String orderNumber) {
        Map<String, Object> paymentInfo = new HashMap<>(); // 创建支付信息对象
        
        // 生成支付二维码URL（这里使用模拟数据，实际项目中应该调用第三方支付接口）
        String qrCodeUrl = generateQRCodeUrl(amount, paymentMethod, orderNumber); // 生成二维码URL
        String paymentUrl = generatePaymentUrl(amount, paymentMethod, orderNumber); // 生成支付URL
        
        paymentInfo.put("qrCodeUrl", qrCodeUrl); // 二维码URL
        paymentInfo.put("paymentUrl", paymentUrl); // 支付URL
        paymentInfo.put("orderNumber", orderNumber); // 订单号
        paymentInfo.put("amount", amount); // 支付金额
        paymentInfo.put("paymentMethod", paymentMethod); // 支付方式
        paymentInfo.put("expireTime", LocalDateTime.now().plusMinutes(30)); // 过期时间（30分钟）
        
        return paymentInfo; // 返回支付信息
    }
    
    // 生成二维码URL（国内可用）
    private String generateQRCodeUrl(BigDecimal amount, String paymentMethod, String orderNumber) {
        String data = String.format("payment://%s/%s/%s", paymentMethod.toLowerCase(), orderNumber, amount);
        try {
            String encodedData = java.net.URLEncoder.encode(data, "UTF-8");
            return "https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=" + encodedData;
        } catch (Exception e) {
            return "https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=" + data;
        }
    }
    
    // 生成支付URL（模拟）
    private String generatePaymentUrl(BigDecimal amount, String paymentMethod, String orderNumber) {
        // 这里应该调用第三方支付接口生成真实的支付URL
        // 现在使用模拟数据
        return String.format("https://payment.example.com/pay?method=%s&order=%s&amount=%s", 
                           paymentMethod.toLowerCase(), orderNumber, amount); // 返回支付URL
    }
    
    // 检查支付状态
    @Transactional // 事务注解，确保数据一致性
    public Map<String, Object> checkPaymentStatus(Long userId, Long orderId) {
        Map<String, Object> response = new HashMap<>(); // 创建响应对象
        
        try {
            // 查找订单
            Optional<Order> orderOptional = orderRepository.findById(orderId); // 根据ID查找订单
            if (!orderOptional.isPresent()) { // 如果订单不存在
                response.put("success", false); // 设置成功状态为false
                response.put("message", "订单不存在"); // 设置错误消息
                return response; // 返回响应
            }
            
            Order order = orderOptional.get(); // 获取订单对象
            
            // 验证订单是否属于当前用户
            if (!order.getUserId().equals(userId)) { // 检查用户ID是否匹配
                response.put("success", false); // 设置成功状态为false
                response.put("message", "订单不属于当前用户"); // 设置错误消息
                return response; // 返回响应
            }
            
            // 检查支付状态（这里应该调用第三方支付接口查询真实状态）
            boolean isPaid = checkPaymentStatusFromThirdParty(order.getOrderNumber()); // 从第三方查询支付状态
            
            if (isPaid) { // 如果已支付
                // 更新订单状态
                order.setStatus(Order.OrderStatus.PAID); // 设置订单状态为已付款
                order.setPaymentStatus(Order.PaymentStatus.PAID); // 设置支付状态为已支付
                order.setUpdatedAt(LocalDateTime.now()); // 设置更新时间
                
                // 保存订单
                Order savedOrder = orderRepository.save(order); // 保存订单到数据库
                
                response.put("success", true); // 设置成功状态为true
                response.put("message", "支付成功"); // 设置成功消息
                response.put("order", savedOrder); // 返回更新后的订单
                response.put("paidAt", LocalDateTime.now()); // 返回支付时间
            } else { // 如果未支付
                response.put("success", true); // 设置成功状态为true
                response.put("message", "等待支付"); // 设置等待消息
                response.put("paid", false); // 返回未支付状态
            }
            
        } catch (Exception e) { // 捕获异常
            response.put("success", false); // 设置成功状态为false
            response.put("message", "查询支付状态失败: " + e.getMessage()); // 设置错误消息
        }
        
        return response; // 返回响应
    }
    
    // 从第三方查询支付状态（模拟）
    private boolean checkPaymentStatusFromThirdParty(String orderNumber) {
        // 这里应该调用第三方支付接口查询真实状态
        // 现在使用模拟数据，随机返回支付状态
        return Math.random() < 0.3; // 30%的概率返回已支付
    }
    
    // 获取支付方式列表
    public Map<String, Object> getPaymentMethods() {
        Map<String, Object> response = new HashMap<>(); // 创建响应对象
        
        try {
            // 返回支持的支付方式
            Map<String, String> paymentMethods = new HashMap<>(); // 创建支付方式映射
            paymentMethods.put("ALIPAY", "支付宝"); // 支付宝
            paymentMethods.put("WECHAT", "微信支付"); // 微信支付
            paymentMethods.put("BANK_CARD", "银行卡"); // 银行卡
            paymentMethods.put("CASH", "现金"); // 现金
            
            response.put("success", true); // 设置成功状态为true
            response.put("paymentMethods", paymentMethods); // 返回支付方式列表
        } catch (Exception e) { // 捕获异常
            response.put("success", false); // 设置成功状态为false
            response.put("message", "获取支付方式失败: " + e.getMessage()); // 设置错误消息
        }
        
        return response; // 返回响应
    }
} 